/*  --------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen -----------------------------
    File Name      : CMP.c
    Author         : Fortiortech  Appliction Team
    Version        : V1.0
    Date           : 2020-04-11
    Description    : This file contains .C file function used for Motor Control.
    ----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
    ------------------------------------------------------------------------------------------------- */
#include "MyProject.h"

/*  ----------------------------------------------------------------------------------------------*/
/*  Function Name  : CMP0_Init
    /*  Description    : CMP0初始化
    /*  Date           : 2020-09-06
    /*  Parameter      : None
    /*  描述：配置为使用内部虚拟中性点的模式
    /*  ----------------------------------------------------------------------------------------------*/
void CMP0_Open_Init(void)
{
     
     SetBit(P1_AN , PIN3);   
     SetBit(P1_AN , PIN4);  
     SetBit(P1_AN , PIN5);   
    
    
/*  -------------------------------------------------------------------------------------------------
CMP_CR0
[7:6]  CMP3IM CMP3 中断模式  00-不产生中断 01-上升沿产生中断 10-下降沿产生中断 11-逐波限流
[5:4]  CMP2IM 同CMP0
[3:2]  CMP1IM 同CMP0
[1:0]  CMP0IM CMP0 中断模式  00-不产生中断 01-上升沿产生中断 10-下降沿产生中断 11-上升下降均产生中断

-------------------------------------------------------------------------------------------------*/
    ClrBit(CMP_CR0 , CMP2IM1);
    ClrBit(CMP_CR0 , CMP2IM0);
    
    ClrBit(CMP_CR0 , CMP1IM1);
    ClrBit(CMP_CR0 , CMP1IM0);
    
    ClrBit(CMP_CR0 , CMP0IM1);
    ClrBit(CMP_CR0 , CMP0IM0);
    /*均不均产生中断，注意：使能中断后一定要有对应的中断函数，否则程序会跑飞*/
  
/*  -------------------------------------------------------------------------------------------------
CMP_CR1
[7]    RSV
[6:5]  CMP3MOD CMP3的模式选择  00-单比较器  01-双比较器  1X-3比较器 
[4]    CMP3EN  CMP3使能
[3]    CMP3HYS CMP3的迟滞电压
[2]    RSV
[1：0] CMP0HYS CMP0/1/2的迟滞电压
-------------------------------------------------------------------------------------------------*/    
    ClrBit(CMP_CR1 , CMP0HYS2);
    ClrBit(CMP_CR1 , CMP0HYS1);
    ClrBit(CMP_CR1 , CMP0HYS0);
    /*无迟滞电压设置*/
    
/*  -------------------------------------------------------------------------------------------------
CMP_CR2
[7]    CMP4EN
[6:5]  CMP0MOD CMP0/1/2的模式设置
[4:3]  CMP0SEL CMP0/1/2的端口组合选择，与CMP_CR2[CMP0MOD]组合使用  
[2:1]  RSV 
[0]    CMP0EN 
-------------------------------------------------------------------------------------------------*/    
	ClrBit(CMP_CR2 , CMP0MOD1);//00-->无内置电阻3比较器     	01-->有内置电阻3比较器模式
	SetBit(CMP_CR2 , CMP0MOD0);//10-->3差分比较器				11-->2比较器
	
	ClrBit(CMP_CR2 , CMP0SEL1);
	ClrBit(CMP_CR2 , CMP0SEL0);
	
	ClrBit(CMP_CR2 , CMP0CSEL1);
	ClrBit(CMP_CR2 , CMP0CSEL0);
    /*内置虚拟中性点设置*/
    
/*  -------------------------------------------------------------------------------------------------
CMP_CR3
[7]    CMPDTEN  比较器死区采样使能
[6:5]  DBGSEL   输出Debug 信号选择，输出到P0.1 端口
[4:3]  SAMSEL   CMP0、CMP1、CMP2 和ADC 在PWM ON/OFF 采样延迟使能
                    00-在ON 和OFF 均采样，无延迟采样
                    01-只在OFF 采样，根据 CMP_SAMR 延迟采样
                    10-只在ON 采样，根据 CMP_SAMR 延迟采样
                    11-在ON 和OFF 均采样，根据 CMP_SAMR 延迟采样
[2:0]  CMPSEL   比较器输出选择，输出到P0.7 端口
-------------------------------------------------------------------------------------------------*/    
	ClrBit(CMP_CR3 , CMPDTEN);	
    
//    #if (SampleLocation == ON_Sample)
//    {
        SetBit(CMP_CR3 , SAMSEL1);	
        ClrBit(CMP_CR3 , SAMSEL0);	
//    }
//    #else
//    {
//        ClrBit(CMP_CR3 , SAMSEL1);	
//        SetBit(CMP_CR3 , SAMSEL0);	
//    }
//    #endif 


								
/*  -------------------------------------------------------------------------------------------------
CMP_CR4
[7]   CMP4OUT    CMP4 比较结果
[6:5] RSV      
[4]   CMP3P4M_FS CMP3P 与CMP4M 功能转移至P3.4
[3]   RSV   
[2]   FAEN       滤波采样系数扩大使能
[1]   CMP0FS     CMP1/CMP2 功能转移
[0]   RSV   
-------------------------------------------------------------------------------------------------*/   	
	SetBit(CMP_CR4 , FAEN);	
	SetBit(CMP_CR4 , CMP0_FS);	
    /*
        比较器输入信号不转移   P1.4 P1.6 P2.1作为电机的输入 
        比较器输入信号转移     P1.3 P1.4 P1.5作为电机的输入     
    */

/*  -------------------------------------------------------------------------------------------------
CMP_SAMR
采样屏蔽区间设置
-------------------------------------------------------------------------------------------------*/   	
    CMP_SAMR = 0x22;
    
///*  -------------------------------------------------------------------------------------------------
//CMP_SR
//采样屏蔽区间设置
//-------------------------------------------------------------------------------------------------*/   	
    CMP_SR = 0x00;
    
/*  -------------------------------------------------------------------------------------------------
HALL_CR
采样屏蔽区间设置
-------------------------------------------------------------------------------------------------*/   	
//    HALL_CR = 0x00;

/*  -------------------------------------------------------------------------------------------------
使能比较器012
-------------------------------------------------------------------------------------------------*/  
    SetBit(CMP_CR2 , CMP0EN);
}

/*  -------------------------------------------------------------------------------------------------
    Function Name : void CMP3_Iint(void)
    Description   : 比较器3初始化,用于硬件过流保护
    Input         : 无
    Output        : 无

    运放正端               (+)----- P20/P23/P27(可选)
    运放负端               (-)----- 1.片外分压电阻(P2.6输入)； 2.片内DAC
    -------------------------------------------------------------------------------------------------*/

uint16 test;
void CMP3_Init(void)
{
    SetBit(P2_AN, P27);        // CMP3 Pin设置为模拟模式  +
    ClrBit(CMP_CR1, CMP3MOD1); // 00-->P27-单比较器模式    01-->P20/P23-双比较器模式
    ClrBit(CMP_CR1, CMP3MOD0); // 1X-->P20/P23/P27-三比较器模式


    /******************************
            0: 正常模式，DAC输出电压范围为0到VREF
            1: 半电压转换模式，DAC输出电压范围为VHALF到VREF
    ****************************/
    ClrBit(DAC_CR, DACMOD);
    test = DAC_OvercurrentValue;
    /*设置DAC过流值*/
    if (DAC_OvercurrentValue % 2 == 0) // DAC_OvercurrentValue = _Q9(I_ValueX((OverHardcurrentValue))) +0xff
    {
        ClrBit(DAC1_DR, DAC0_DR_0);
    }
    else
    {
        SetBit(DAC1_DR, DAC0_DR_0); // DAC0最低位设置
    }
    DAC0_DR = (DAC_OvercurrentValue >> 1); // DAC0高8位设置
    /*DAC0 使能*/
    SetBit(DAC_CR, DAC0_1EN); /*母线电流保护触发信号源 0-CMP3,1-INT0*/
    ClrBit(EVT_FILT, EFSRC);
    /*
        触发硬件保护后硬件关闭驱动输出MOE配置
        00--MOE不自动清零
        01--MOE自动清零
        10--在DRV计数器的上溢下溢事件和每隔 10us 自动使能MOE
        11--在DRV计数器的上溢下溢事件和每隔 5us 自动使能MOE
    */
    ClrBit(EVT_FILT, MOEMD1);
    SetBit(EVT_FILT, MOEMD0);

    /*
        母线电流保护时间滤波宽度
        00-不滤波
        01-4cpu clock
        10-8cpu clock
        11-16cpu clock
    */
    SetBit(EVT_FILT, EFDIV1);
    SetBit(EVT_FILT, EFDIV0);

    /*CMP3运放输出端中断设置*/
    ClrBit(CMP_CR1, CMP3HYS);                        // CMP3的迟滞配置
    ClrBit(CMP_CR1, CMP0HYS2 | CMP0HYS1 | CMP0HYS0); //无迟滞

    SetBit(CMP_CR1, CMP3EN); // CMP3 Enable
}

/*  ----------------------------------------------------------------------------------------------*/
/*  Function Name  : CMP3_Interrupt_Init
    /*  Description    : CMP3中断配置
    /*  Date           : 2020-09-06
    /*  Parameter      : None
    /*  ----------------------------------------------------------------------------------------------*/
void CMP3_Interrupt_Init(void)
{
    ClrBit(CMP_SR, CMP3IF);

    /*
        比较器中断模式配置
        00: 不产生中断
        01: 上升沿产生中断
        10: 下降沿产生中断
        11: 上升/下降沿产生中断
    */
    ClrBit(CMP_CR0, CMP3IM1);
    SetBit(CMP_CR0, CMP3IM0);
    PCMP31 = 1;
    PCMP30 = 1; // 中断优先级别3
}

/*  ----------------------------------------------------------------------------------------------*/
/*      Function Name  :   TSD_INIT
    /*  Description    :   温度保护初始化
    /*  Date           :   2023-08-09
    /*  Parameter      :   None
    /*  ----------------------------------------------------------------------------------------------*/
void TSD_INIT(void)
{
		
	ClrBit(TSD_CR,TSDEN);    //关闭保护使能
	TSDIE = 1;               //温度保护中断使能
    
	SetBit(TSD_CR,TSDADJ3);  //温度保护值设定   0000-71℃   0001-75℃    0010-80℃    0011-84℃     0100-89℃    
	SetBit(TSD_CR,TSDADJ2);   //                0101-94℃   0110-99℃		0111-105℃	 1000-111℃		1001-116℃	
	ClrBit(TSD_CR,TSDADJ1);   //                1010-123℃  1011-131℃ 	1100-136℃   1101-142℃   1110-150℃
	ClrBit(TSD_CR,TSDADJ0); 
    
	SetBit(IP0,PLVW1);        //中断优先级设置
	SetBit(IP0,PLVW0);        
	SetBit(TSD_CR,TSDEN);     //使能
}